using System;
using System.Collections.Generic;
using System.Text;
using tp1.Entidades;

namespace tp1
{
    class Transformaciones
    {
        private static Stack<Matriz> _stackMatrices = new Stack<Matriz>();
        private static Matriz _matrizDeTransformaciones = new Matriz(3, 3);

        public static Punto Transformar(Punto punto)
        {
            return _matrizDeTransformaciones * punto;
        }

        public static Matriz MatrizDeTransformacion
        {
            get { return _matrizDeTransformaciones; }
        }

        public static void AgregarTraslacion(double traslacionX, double traslacionY)
        {
            MatrizTraslacion matriz = new MatrizTraslacion(new Punto(traslacionX, traslacionY));
            _matrizDeTransformaciones *= matriz;
        }

        public static void AgregarRotacion(double angulo/*, Punto centroDeRotacion*/)
        {
            angulo = Math.PI * angulo / 180.0;
            /*Matriz traslacion = new Matriz(3, 3);
            traslacion[0, 2] = centroDeRotacion.X;
            traslacion[1, 2] = centroDeRotacion.Y;

            Matriz traslacionInversa = new Matriz(3, 3);
            traslacionInversa[0, 2] = -centroDeRotacion.X;
            traslacionInversa[1, 2] = -centroDeRotacion.Y;*/

            MatrizRotacion rotacion = new MatrizRotacion(angulo);

            //_matrizDeTransformaciones *= traslacion;
            _matrizDeTransformaciones *= rotacion;
            //_matrizDeTransformaciones *= traslacionInversa;
        }

        public static void AgregarEscalado(double escaladoX, double escaladoY)
        {
            MatrizEscalado matriz = new MatrizEscalado(escaladoX, escaladoY);
            _matrizDeTransformaciones *= matriz;
        }

        public static void CargarIdentidad()
        {
            _stackMatrices.Clear();
            _matrizDeTransformaciones = new Matriz(3, 3);
        }

        public static void PushMatrix()
        {
            _stackMatrices.Push(_matrizDeTransformaciones);
            //_matrizDeTransformaciones = new Matriz(3, 3);
        }

        public static void PopMatrix()
        {
            _matrizDeTransformaciones = _stackMatrices.Pop();
        }
    }
}
